package ch00.ch04;

/**
 *
 * 上边界（协变）和下边界（逆变）的测试
 *
 * @Author lzp
 * @Date 2024-04-07
 */
public class Text02 {
    public static void main(String[] args) {
        // 1.实例化动物对象
        Tiger tg = new Tiger();

        // 2.实例化饲养员对象
        // 正确 - 子类可以实例化父类对象 - 多态
        // SiYangYuan zs = new BuRuAnimalSiYangYuan();

        // 正确 - 指定具体泛型类型为：边界类的子类
        // SiYangYuan<BuRuAnimal> zs = new BuRuAnimalSiYangYuan<BuRuAnimal>();

        // 错误 - why? -
        // 父类可以接收子（多态），但泛型父类不能接收泛型子类
        // 不变性 - 赋值运算符左、右两边的泛型类型必须保持一致 - 解决：使用通配符
        // SiYangYuan<Animal> zs = new BuRuAnimalSiYangYuan<BuRuAnimal>();

        // 正确 - why? - 指定边界为Animal，则具体的泛型类型为：Animal或其子类
        // SiYangYuan zs = new BuRuAnimalSiYangYuan<BuRuAnimal>();

        // 正确，但为什么调用 weiYang 方法时报错呢？
        // 原因 - 协变后的对象，不能调用具有泛型参数的方法  - 解决：通过逆变操作
        // SiYangYuan<? extends Animal> zs = new BuRuAnimalSiYangYuan<BuRuAnimal>();

        SiYangYuan<? super BuRuAnimal> zs = new BuRuAnimalSiYangYuan<BuRuAnimal>();
        // 3.操作
        zs.WeiYang(tg);
    }
}
